【IEEE S&P 2021】Intel CPUのL1-Dキャッシュからデータを追い出し、データを盗み出すCacheOut攻撃
TL;DR
Intel CPUのL1 cacheからデータを追い出し、バッファからデータの読み取り/書き込みを行うCacheOut
プロセス分離、user/kernel分離、hyperisorによる仮想化、SGXに対する攻撃を実施
本文
SpectreやMeltdownによって明らかにされた投機的実行のセキュリティ上の危険性を経て、CPUの設計は大きな変更を余儀なくされた。さらにMicroarchitectural Data Sampling (MDS) も登場し、CPUのアドレスと権限チェックをバイパスし、load命令のassistingとfaultを介してバッファの内容をリークしうることが指摘されている。本論文で提案されたCacheOutもMDSの一種だ。
マルチコアプロセッサには、各コアごとにL1-D cacheが存在する。cacheに格納するデータサイズは16-256 bytes程度で、この大きさはcache lineと呼ばれる。cacheに対するFLUSH + RELOAD攻撃もcache line単位で共有メモリを処理する。具体的には、clflush命令などでcache lineを繰り返しflushし、reloadにかかる時間を測定する。測定の結果、reloadに要する時間が短ければ、別のプロセスがcache lineをcacheに戻したと推測できる。
またプロセッサにはcache以外にもmicroarchitectural buffersが存在する。データがL1-D cacheから追い出されると、データがLine Fill Buffers (LFB) に転送されるが、CacheOutではLFBが攻撃ポイント(Fig. 1の赤矢印)となり、データの復元に利用されている。
https://gyazo.com/2b0a87b2446aae239ba65f026810060f
(論文より引用)
Fig. 10はSGXへの攻撃フローを表した図であり、LFBへ追い出されたデータがTSX Asynchronous Abort (TAA)によってサンプリングされることを示している。
https://gyazo.com/e37aa9e1cd563d84196d86cdef3b6c2c
(論文より引用)
最近のIntelプロセッサは Transactional Memory Extension (TSX) を介してtransactional memoryを実現している。TSXはトランザクションの開始・終了をXBEGIN・XEND命令でマークし、投機的に実行されたトランザクションが、XENDに達した場合のみcommitするという方式だ。
TAAエクスプロイトは、loadトランザクションを実行する前に、cache lineをflushするところから始まる。flushed lineを読み取るとトランザクションが中止されるが、中止前にプロセッサはload命令をLFBエントリに割り当てる。結果、load命令はLFBからデータを投機的に処理可能になるが、loadは正常に完了しないため、loadは以前のメモリアクセスからの残滓で実行され、攻撃者がLFBデータをsamplingできてしまう。CacheOutもこのTAAエクスプロイトを利用している。
本論文ではCacheOutで様々な攻撃PoCを実装しており、それぞれを簡単に紹介したい。
プロセス分離への攻撃
OpenSSLのAESを対象に、秘密鍵と平文を復元
RSA秘密鍵の復元
Fast Aritificial Neural Network (FANN)の秘密の重みを復元
学習に投資する企業にとっては重要なIP
Linux Kernelへの攻撃
ユーザプロセスからkernel address space layout Randomizationを1秒以内に完全に非ランダム化
kernelのstack canariesを抽出
スタックオーバーフローに対する多層防御の一つ
SGXへの攻撃
enclaveの内容を復元
https://gyazo.com/5c7144e46efd8c6217162d13938b2a28
(論文より引用)
デバッグモードのEPID keysを復元
enclaveがidle状態のときに、memory contentをdump
idle状態なので、constant-time codingでは防げない
hypervisorによるVM仮想化への攻撃
AES keyの復元
RSA keyの復元
ニューラルネットワークの重み
nrryuya.icon > モナリザの絵などはサイズが大きい、鍵は小さい。また、認証タグをつかって候補を全部試す。
論文中ではCacheOutに対する対策も議論されている。真っ先に思いつくのが、L1-D cacheをflushしてしまうことだろう。しかし著者らはオーバーヘッドが大きくこの対策は推奨していない。筆者らが推奨しているのは、TAA対処のためTSXを無効化することで、実際にIntelからはTSXを無効化できるマイクロコードアップデートが出ている。しかしことSGXにおいては、悪意あるOSが脅威となり、TSXはOSによって有効化が可能なため、SGXのコンテキストではTSXが排他的に無効化されるような仕組みが必要だとしている。
2018年に大きな話題となったSpectreやMeltdownから3年。Intelの対策もなされているが、MDSのような攻撃も提案されており、攻撃の高度化を感じた。対策、攻撃どちらの面からも引き続き最新動向を注視したい。(文責・恩田) Appendix
なぜLFBを使うのか→address selectionのため
LFBにはload命令を読み取るbuffer内の位置を制御するoffsetが存在
faultとassisting loadは後続のload命令から古いoffsetを使用する可能性がある
cache evictionと組み合わせるとリークするaddressの下位12-bitを制御可能
LFBの目的
track outstanding L1 Data Cache misses and to interface between the byte-oriented loads and stores in the core and the cache-line transfers outside of the L1 Data Cache
(論文中の説明)cache missが発生したときにメモリ階層の下位レベルからデータを取得し、L1-D cacheのnon-blocking operation modeを有効にすること
プロセッサがload命令を処理するとき、LFBとL1-D cache両方を並行して参照し、どちらかで見つかればデータをloadする
見つからない場合は、LFBにエントリを割り当て、L2 cacheへリクエストを送る動作
その他の対策
Hyper-Threadingの無効化
攻撃者と被害者が同一物理コア上の2つのthreadでparallelに動作しているときが最も攻撃がしやすい
一方で無効化しても、難易度が上がるだけで不可能ではない
hyper-theading無効化はパフォーマンスが落ちるので、対策としては非推奨
CacheOutの制限
他のtransient-execution attack primitivesでCacheOutは実行できなかった
例: mispredicted branches
cross-process、VM、kernel variantsの信号にノイズが多く、攻撃を繰り返し行う必要がある
TSXを使用しないCacheOutのSN比向上はfuture work
L1-D cache内に存在するデータのみをleakできる
memory 階層の他レベルは不可
L3 cacheは物理コア間でshareされることが多いため、L3データを読み取るような手法の探求は重要